package w83b.w83bOperacionesPaso.w83bDatosMinisterio;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import org.apache.commons.lang.StringUtils;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import w83b.w83bBeans.W83bDatosMinisterioBean;
import w83b.w83bUtilidadesComunes.W83bUtilidades;

import es.ejie.frmk.presentacion.operacion.paso.Q70ActionPasoOP;
import es.ejie.frmk.presentacion.sesiondatos.Q70ContextoEJIE;

public class W83bCrearFicheroMinisterioAction  extends Q70ActionPasoOP{
	
	protected void processOP(Q70ContextoEJIE contexto, ActionErrors errores, ActionMapping mapping,
			ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		
	}

	
	protected ActionForward processForward(Q70ContextoEJIE contexto, ActionErrors errors, ActionMapping mapping, 
			ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		
	
        BufferedWriter bw;
      
        List listaDatos = (ArrayList)contexto.get("w83bResultadoDatosMinisterio");
        HashMap mapa1 = (HashMap)listaDatos.get(0);
        HashMap mapa2 = (HashMap)listaDatos.get(1);
        HashMap mapa3 = (HashMap)listaDatos.get(2);
      
        File fichero = new File("FD1602.txt");
        fichero.createNewFile();
        bw = new BufferedWriter(new FileWriter(fichero.getAbsolutePath()));
        
        StringBuffer linea = new StringBuffer();
      
        if(mapa1.size()==0){
        	 linea.append("No existen datos"); 
        	  bw.write(linea.toString()); 
        	//no hay datos
        }else{
        	
        	Iterator mapActas = mapa1.keySet().iterator();
		    
		    while(mapActas.hasNext()){
		    	boolean tienedelegados=false;
		    	String key = (String)mapActas.next();
		    	
		    	W83bDatosMinisterioBean elDato = (W83bDatosMinisterioBean)mapa1.get(key);
		    	
		    	StringTokenizer tokenizer = new StringTokenizer(elDato.getCodSindicato(),",");//NOPMD
					
				List sindicatos = new ArrayList();//NOPMD
				while(tokenizer.hasMoreTokens()){
					String sindicato = tokenizer.nextToken();
					sindicatos=W83bUtilidades.addUnique(sindicatos,sindicato);
				}
				for(int i=0;i<sindicatos.size();i++){
			        W83bDatosMinisterioBean elSindicato0 = (W83bDatosMinisterioBean)mapa3.get((String)sindicatos.get(i)+"0"+key);
			        W83bDatosMinisterioBean elSindicato1 = (W83bDatosMinisterioBean)mapa3.get((String)sindicatos.get(i)+"1"+key);
			        if ((elSindicato0!=null&&Integer.parseInt(elSindicato0.getTotalDelegHombre())!=0)||(elSindicato1!=null&&Integer.parseInt(elSindicato1.getTotalDelegHombre())!=0)){
			        	tienedelegados=true;
			        	break;
					}
				
				}
				if (tienedelegados){
			    	linea = new StringBuffer();//NOPMD	        		
			        linea.append("1"); 
			        linea.append(elDato.getNifCentroTrabajo()); //CIF (9 caracteres)
			        String razonSocial = elDato.getRazonSocial(); 
			        if(razonSocial.length()>32){
			        	razonSocial = razonSocial.substring(0,32);
			        }
			        linea.append(rellenaBlancos(razonSocial, 33, false));//RAZON SOCIAL
			        linea.append(elDato.getTipoEmpresa());//TIPO EMPRESA
			        String domicilio ="";
			        if(!StringUtils.isEmpty(elDato.getDomicilio())){
			        	domicilio = elDato.getDomicilio(); 
			        }
			         
			        if(domicilio.length()>32){
			        	domicilio = domicilio.substring(0,32);
			        }
			        linea.append(rellenaBlancos(domicilio, 33, false));//DESCRIPCION CENTRO (DOMICILIO)
			        linea.append(rellenaCeros(elDato.getMunicipio(), 3, true));//MUNICIPIO
			        String cnae = elDato.getCnae(); 
			        if(cnae.length()>3){
			        	cnae = cnae.substring(0,3);
			        }
			        linea.append(rellenaCeros(cnae, 3, true));//CNAE
			         
			        linea.append(rellenaBlancos(elDato.getConvenioMadrid(), 7, false));//CONVENIO
			        linea.append(rellenaCeros("", 10, false));//TRAB FIJOS Y EVANTUALES
			        linea.append(rellenaCeros(elDato.getTotalElectores(), 5, true));//TOTAL TRABAJADORES
			        linea.append(rellenaBlancos("", 5, true));//COD MINISTERIO Y COD ORGANISMO
			        linea.append(rellenaBlancos("", 9, true));//NÚMERO DE SS
			        linea.append(rellenaCeros("", 2, true));//NÚMERO PROVINCIA DE SS
			        linea.append(rellenaCeros(elDato.getTerritorio(), 2, true));//TERRITORIO DEL ACTA
			        linea.append(rellenaCeros(elDato.getNumRegistroDef(), 5, true));//NUM REG DEFINT. DEL ACTA
			        String fechaEleccion = elDato.getFechaEleccion();//.substring(0,10);
			        linea.append(fechaEleccion.replaceAll("/", ""));//FECHA DE ELECCIÓN
			        linea.append("A");//TIPO DEL ACTA
			        linea.append(rellenaCeros(elDato.getTotalElectores(), 5, true));//TOTAL ELECTORES
			        Integer totalElec = new Integer (elDato.getTotalElectores());//NOPMD
			        if(totalElec.intValue()<50){//TIPO ELECCCION: Si trabajadores < 50 = D, sino C
			        	linea.append("D");
			        }else{
			        	linea.append("C");
			        }
	        		
			        Integer delegHombres;
		        	
		        	int totalDeleg =0;
			        W83bDatosMinisterioBean elColegio = (W83bDatosMinisterioBean)mapa2.get("0"+key);
			        W83bDatosMinisterioBean elColegio1 = (W83bDatosMinisterioBean)mapa2.get("1"+key);
			        if(totalElec.intValue()<50){
			        
				        linea.append("0");//CÓDIGO DEL COLEGIO
			        	linea.append("T");//ÁMBITO DE LA ELECCIÓN
			        	if(elColegio==null){
			        		linea.append(rellenaCeros("",49, true));
			        	}else{
				        	linea.append(rellenaCeros("", 10, true));//ELECTORES HOMBRES Y MUJERES
				        	linea.append(rellenaCeros(elColegio.getElecColegio(), 5, true));//ELECTORES COLEGIO
				        	linea.append(rellenaCeros("", 2, true));//REPRESENTANTES ELEGIBLES
				        	linea.append(rellenaCeros("", 5, true));//VOTANTES VARONES
				        	linea.append(rellenaCeros("", 5, true));//VOTANTES MUJERES
				        	linea.append(rellenaCeros(elColegio.getVotantes(), 5, true));//TOTAL VOTANTES
				        	linea.append(rellenaCeros(elColegio.getPapeletasvalidas(), 5, true));//VOTOS VÁLIDOS
				        	linea.append(rellenaCeros(elColegio.getPapeletasblancas(), 5, true));//VOTOS BLANCOS
				        	linea.append(rellenaCeros(elColegio.getPapeletasnulas(), 5, true));//VOTOS NULOS
				        			        	
				        	delegHombres=new Integer("0");//NOPMD
				        	
				        	if(elColegio.getTotalDelegHombre()==null || ("").equals(elColegio.getTotalDelegHombre())){
				        		delegHombres = new Integer("0");//NOPMD
				        	}else{
				        		delegHombres = new Integer(elColegio.getTotalDelegHombre());//NOPMD
				        	}
				      
				        	totalDeleg =delegHombres.intValue();
				        	linea.append(rellenaCeros(totalDeleg+"", 2, true));//TOTAL DELEGADOS
			        	}
			        	
			        	linea.append("1");//CÓDIGO DEL COLEGIO
				        linea.append("0");//ÁMBITO DE LA ELECCIÓN
				        linea.append(rellenaCeros("",49, true));
				        
			        	linea.append("2");//CÓDIGO DEL COLEGIO
				        linea.append("0");//ÁMBITO DE LA ELECCIÓN
				        linea.append(rellenaCeros("",49, true));
				        linea.append("3");//CÓDIGO DEL COLEGIO
				        linea.append("0");//ÁMBITO DE LA ELECCIÓN
				        linea.append(rellenaCeros("",49, true));
			        }else{
			        	linea.append("0");//CÓDIGO DEL COLEGIO
				        linea.append("0");//ÁMBITO DE LA ELECCIÓN
				        linea.append(rellenaCeros("",49, true));
				        
				        linea.append("1");//CÓDIGO DEL COLEGIO
			        	linea.append("T");//ÁMBITO DE LA ELECCIÓN
			        	if(elColegio==null){
			        		linea.append(rellenaCeros("",49, true));
			        	}else{
				        	linea.append(rellenaCeros("", 10, true));//ELECTORES HOMBRES Y MUJERES
				        	linea.append(rellenaCeros(elColegio.getElecColegio(), 5, true));//ELECTORES COLEGIO
				        	linea.append(rellenaCeros("", 2, true));//REPRESENTANTES ELEGIBLES
				        	linea.append(rellenaCeros("", 5, true));//VOTANTES VARONES
				        	linea.append(rellenaCeros("", 5, true));//VOTANTES MUJERES
				        	linea.append(rellenaCeros(elColegio.getVotantes(), 5, true));//TOTAL VOTANTES
				        	linea.append(rellenaCeros(elColegio.getPapeletasvalidas(), 5, true));//VOTOS VÁLIDOS
				        	linea.append(rellenaCeros(elColegio.getPapeletasblancas(), 5, true));//VOTOS BLANCOS
				        	linea.append(rellenaCeros(elColegio.getPapeletasnulas(), 5, true));//VOTOS NULOS
				        			        	
				        	delegHombres=new Integer("0");//NOPMD
				        	
				        	if(elColegio.getTotalDelegHombre()==null || ("").equals(elColegio.getTotalDelegHombre())){
				        		delegHombres = new Integer("0");//NOPMD
				        	}else{
				        		delegHombres = new Integer(elColegio.getTotalDelegHombre());//NOPMD
				        	}
				        
				        	totalDeleg =delegHombres.intValue(); 
				        	linea.append(rellenaCeros(totalDeleg+"", 2, true));//TOTAL DELEGADOS
			        	}
			        	
			        	elColegio = (W83bDatosMinisterioBean)mapa2.get("1"+key);
				        
				        linea.append("2");//CÓDIGO DEL COLEGIO
			        	linea.append("T");//ÁMBITO DE LA ELECCIÓN
			        	if(elColegio1==null){
			        		linea.append(rellenaCeros("",49, true));
			        	}else{
				        	linea.append(rellenaCeros("", 10, true));//ELECTORES HOMBRES Y MUJERES
				        	linea.append(rellenaCeros(elColegio1.getElecColegio(), 5, true));//ELECTORES COLEGIO
				        	linea.append(rellenaCeros("", 2, true));//REPRESENTANTES ELEGIBLES
				        	linea.append(rellenaCeros("", 5, true));//VOTANTES VARONES
				        	linea.append(rellenaCeros("", 5, true));//VOTANTES MUJERES
				        	linea.append(rellenaCeros(elColegio1.getVotantes(), 5, true));//TOTAL VOTANTES
				        	linea.append(rellenaCeros(elColegio1.getPapeletasvalidas(), 5, true));//VOTOS VÁLIDOS
				        	linea.append(rellenaCeros(elColegio1.getPapeletasblancas(), 5, true));//VOTOS BLANCOS
				        	linea.append(rellenaCeros(elColegio1.getPapeletasnulas(), 5, true));//VOTOS NULOS
				        	
				        	delegHombres=new Integer("0");//NOPMD
				        	
				        	if(elColegio1.getTotalDelegHombre()==null || ("").equals(elColegio1.getTotalDelegHombre())){
				        		delegHombres = new Integer("0");//NOPMD
				        	}else{
				        		delegHombres = new Integer(elColegio1.getTotalDelegHombre());//NOPMD
				        	}
				        	
				        	totalDeleg =delegHombres.intValue();
				        	linea.append(rellenaCeros(totalDeleg+"", 2, true));//TOTAL DELEGADOS
			        	}
				        
			        	
				        linea.append("3");//CÓDIGO DEL COLEGIO
				        linea.append("0");//ÁMBITO DE LA ELECCIÓN
				        linea.append(rellenaCeros("",49, true));
			        
			        }
			        linea.append("\r\n");
			        bw.write(linea.toString()); // TOTAL 162 caracteres
			    	
			        for(int i=0;i<sindicatos.size();i++){
				        W83bDatosMinisterioBean elSindicato0 = (W83bDatosMinisterioBean)mapa3.get((String)sindicatos.get(i)+"0"+key);
				        W83bDatosMinisterioBean elSindicato1 = (W83bDatosMinisterioBean)mapa3.get((String)sindicatos.get(i)+"1"+key);
				        linea = new StringBuffer();//NOPMD
				        linea.append("2"); 
				        linea.append(rellenaCeros(elDato.getTerritorio(), 2, true));
				        linea.append(rellenaCeros(elDato.getNumRegistroDef(), 5, true));//NUM REG DEFINT. DEL ACTA
				        fechaEleccion = elDato.getFechaEleccion();//.substring(0,10);
				        linea.append(fechaEleccion.replaceAll("/", ""));//FECHA DE ELECCIÓN
				      			        
		        		if ((elSindicato0!=null&&Integer.parseInt(elSindicato0.getTotalDelegHombre())!=0)||(elSindicato1!=null&&Integer.parseInt(elSindicato1.getTotalDelegHombre())!=0)){
		        			if (elSindicato0!=null){
		        				linea.append(rellenaBlancos(elSindicato0.getCodMadrid(),6,false));//CODIGO DEL SINDICATO
		        			}
		        			else{
		        				linea.append(rellenaBlancos(elSindicato1.getCodMadrid(),6,false));//CODIGO DEL SINDICATO
		        			}
		        			if(elSindicato0==null){
			        			//linea.append(rellenaBlancos("0",6,false));//CODIGO DEL SINDICATO
				        		linea.append(rellenaCeros("",9, true));
				        	}else{
				        		linea.append("00");			 
					       		delegHombres = new Integer(elSindicato0.getTotalDelegHombre());//NOPMD
					        	totalDeleg =delegHombres.intValue();
					        	linea.append(rellenaCeros(totalDeleg+"", 2, true));//TOTAL DELEGADOS
					        	linea.append(rellenaCeros(elSindicato0.getNumVotos(), 5, true));//TOTAL DELEGADOS
				        	}
				        	
				        	if(elSindicato1==null){
				        		//linea.append(rellenaBlancos("0",6,false));//CODIGO DEL SINDICATO
				        		linea.append(rellenaCeros("",9, true));
				        	}else{	  
				        		
				        		//linea.append(rellenaBlancos(elSindicato1.getCodMadrid(),6,false));//CODIGO DEL SINDICATO
				        		linea.append("00");	
					        	delegHombres = new Integer(elSindicato1.getTotalDelegHombre());//NOPMD
					        	
					        	totalDeleg =delegHombres.intValue();
					        	linea.append(rellenaCeros(totalDeleg+"", 2, true));//TOTAL DELEGADOS
					        	linea.append(rellenaCeros(elSindicato1.getNumVotos(), 5, true));//TOTAL DELEGADOS
				        	}
				        	linea.append(rellenaCeros("", 9, true));	
				        	linea.append("\r\n");
					        bw.write(linea.toString());
		        		}
			        }
				}       	
		    }
        	
        }
        bw.flush();
        bw.close();
      
        BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());      
        BufferedInputStream in = new BufferedInputStream(new FileInputStream(fichero));
            
     
        response.setContentType("text/plain");
        response.setHeader("Content-Disposition","attachment;filename=FD1604.txt");
        int c;
        while ((c = in.read()) != -1){
            out.write(c);
        }
        in.close();
        out.flush();
        out.close(); 
        
     
		
		return null;
	}
	
	
	 public static String rellenaCeros(String datoOriginal, int longitudDeseada, boolean delante) {//NOPMD
			/*
				Funcion a la que se le pasa un String y el tamaño que se quiere que tenga
	            esa String.
				La cadena representa un numero a la que se le quitan los PUNTOS de los miles
	            y las COMAS de los decimales.
	            Despues de quitar todo eso...se rellena con CEROS hasta la longitud deseada.
				Si el parametro 'delante' es true...entonces los ceros se insertan delante de la
	            cadena...si es false, se insertan detras.
	            Ej:
	            	- rellenarCeros("12,34", 5, true) devuelve "01234"
	                - rellenarCeros("1.500,67", 8, false) devuelve "15006700"
			*/

	        String datoRelleno = "";
	        try {
	            if (datoOriginal == null) {
	                datoOriginal = "";
	            }
	            String cero = "0";
	            for (int j = 0; j < datoOriginal.length(); j++) {
	                if (datoOriginal.charAt(j) != ',' && datoOriginal.charAt(j) != '.') {
	                    datoRelleno = datoRelleno + datoOriginal.charAt(j);//NOPMD
	                }
	            }
	            if (datoRelleno.length() < longitudDeseada) {
	                int longRelleno = datoRelleno.length();
	                for (int i = longRelleno; i < longitudDeseada; i++) {
	                    if (delante) {
	                        datoRelleno = cero + datoRelleno;//NOPMD
	                    }
	                    else {
	                        datoRelleno = datoRelleno + cero;//NOPMD
	                    }
	                }
	            }
	        } catch (Exception e) {
	        }
	        return datoRelleno;
	    }
	 
	 public static String rellenaBlancos(String numOriginal, int longitudDeseada, boolean delante) {//NOPMD
		 /*
				Funcion a la que se le pasa un String y el tamaño que se quiere que tenga
	            esa String.
				La cadena representa un numero a la que se le quitan los PUNTOS de los miles
	            y las COMAS de los decimales.
	            Despues de quitar todo eso...se rellena con CEROS hasta la longitud deseada.
				Si el parametro 'delante' es true...entonces los ceros se insertan delante de la
	            cadena...si es false, se insertan detras.
	            Ej:
	            	- rellenarCeros("12,34", 5, true) devuelve "01234"
	                - rellenarCeros("1.500,67", 8, false) devuelve "15006700"
		  */
		 
		 String datoRelleno = "";
		 try {
			 if (numOriginal == null) {
				 numOriginal = "";
			 }
			 String cero = " ";
			 for (int j = 0; j < numOriginal.length(); j++) {
				 if (numOriginal.charAt(j) != ',' && numOriginal.charAt(j) != '.') {
					 datoRelleno = datoRelleno + numOriginal.charAt(j); //NOPMD
				 }
			 }
			 if (datoRelleno.length() < longitudDeseada) {
				 int longRelleno = datoRelleno.length();
				 for (int i = longRelleno; i < longitudDeseada; i++) {
					 if (delante) {
						 datoRelleno = cero + datoRelleno; //NOPMD
					 }
					 else {
						 datoRelleno = datoRelleno + cero; //NOPMD
					 }
				 }
			 }
		 } catch (Exception e) {
		 }
		 return datoRelleno;
	 }
	 
		public String rellenarBlancos (int posiciones) {
		    
		    String retorno = "";
		    
		                   for (int i = 0; i<posiciones; i++) {
		                         retorno = " "+retorno; //NOPMD
		                   }
		    
		    return retorno;
		}
	
}
